package com.garrett.demo.sys;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.garrett.demo.sys.entity.Account;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;


public class AlibabaExcel {

    String fileName = "src/test/resources/demo.xlsx";
    /**
     * 最简单的读
     * <p>
     * 1. 创建excel对应的实体对象
     * <p>
     * 2. 由于默认一行行的读取excel，所以需要创建excel一行一行的回调监听器
     * <p>
     * 3. 直接读即可
     */
    @Test
    public void simpleRead() {
        // 写法1：JDK8+ ,不用额外写一个DemoDataListener
        // since: 3.0.0-beta1

        // 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
//         这里每次会读取3000条数据 然后返回过来 直接调用使用数据就行
        EasyExcel.read(fileName, Account.class, new PageReadListener<Account>(dataList -> {
            for (Account demoData : dataList) {
                System.out.println(demoData);
            }
        })).sheet().doRead();
    }

    /**
     * 最简单的写
     * <p>1. 创建excel对应的实体对象
     * <p>2. 直接写即可
     */
    @Test
    public void simpleWrite() {
        // 知识点：List的初始化赋值
        List<Account> data = Arrays.asList(
                new Account("1","212006677","admin"),
                new Account("3","212006602","password1")
        );
        // 这里 需要指定写用哪个class去读，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, Account.class).sheet("account").doWrite(data);
    }

    /**
     * 重复多次写入
     * <p>
     * 1. 创建excel对应的实体对象
     * <p>
     * 2. 使用注解指定复杂的头
     * <p>
     * 3. 直接调用二次写入即可
     */
    @Test
    public void repeatedWrite() {

        // 方法1 如果写到同一个sheet
        ExcelWriter excelWriter = null;
        try {
            // 这里 需要指定写用哪个class去写
            excelWriter = EasyExcel.write(fileName, Account.class).build();
            // 这里注意 如果同一个sheet只要创建一次
            WriteSheet writeSheet = EasyExcel.writerSheet("account").build();
            // 去调用写入,这里我调用了五次，实际使用时根据数据库分页的总的页数来
            for (int i = 0; i < 5; i++) {
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                List<Account> data = Collections.singletonList(
                        new Account("4", "212006605", "password5")
                );
                excelWriter.write(data, writeSheet);
            }
        } finally {
            // 千万别忘记finish 会帮忙关闭流
            if (excelWriter != null) {
                excelWriter.finish();
            }
        }
    }
}
